package ar.com.equis.flexjavaintegration.persistencia;



import java.io.Serializable;
import java.util.Date;

import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.MappedSuperclass;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import org.hibernate.CallbackException;
import org.hibernate.Session;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.classic.ValidationFailure;

import ar.com.equis.flexjavaintegration.excepciones.NoNegocioExcepcion;
import ar.com.equis.flexjavaintegration.modelo.Usuario;




/**
 * Implementacion de Superclase para todo objeto persistente<br/>
 * Implementa un id autogenerado de tipo uuid y pose el campos:<br/>
 * fecha de Creacion, fecha de Modificacion, Usuario.
 * @author MG
 *
 */
@MappedSuperclass
public abstract class UuidObjetoNegocioPersistente implements IObjetoPersistente {
	
	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue(generator="system-uuid")
	@GenericGenerator(name="system-uuid",strategy="uuid")
	protected String id;
	
	@Temporal(TemporalType.DATE)
	protected Date fechaModificacion;
	@Temporal(TemporalType.DATE)
	protected Date fechaCreacion;
	@ManyToOne(targetEntity=Usuario.class)
	@JoinColumn(name="USUARIO_CREACION_ID")
	protected Usuario usuarioCreacion;
	@ManyToOne(targetEntity=Usuario.class)
	@JoinColumn(name="USUARIO_MODIF_ID")
	protected Usuario usuarioModificacion;
	

	@Override
	public void validate() throws ValidationFailure {
				
	}


	@Override
	public boolean onDelete(Session arg0) throws CallbackException {
		return false;
	}


	@Override
	public void onLoad(Session arg0, Serializable arg1) {
		
	}


	@Override
	public boolean onSave(Session arg0) throws CallbackException {
		this.setFechaCreacion(new Date());
		//this.setIdUsuarioCreacion(MDIBaseWindow.getUsuario().getId());
		return false;
	}


	@Override
	public boolean onUpdate(Session arg0) throws CallbackException {
		this.setFechaModificacion(new Date());
//		this.setIdUsuarioModificacion(MDIBaseWindow.getUsuario().getId());
		return false;
	}


	public Date getFechaModificacion() {
		return fechaModificacion;
	}


	public void setFechaModificacion(Date fechaModificacion) {
		this.fechaModificacion = fechaModificacion;
	}


	public Date getFechaCreacion() {
		return fechaCreacion;
	}


	public void setFechaCreacion(Date fechaCreacion) {
		this.fechaCreacion = fechaCreacion;
	}

	public Usuario getUsuarioCreacion() {
		return usuarioCreacion;
	}


	public void setUsuarioCreacion(Usuario usuarioCreacion) {
		this.usuarioCreacion = usuarioCreacion;
	}


	public Usuario getUsuarioModificacion() {
		return usuarioModificacion;
	}


	public void setUsuarioModificacion(Usuario usuarioModificacion) {
		this.usuarioModificacion = usuarioModificacion;
	}


	public boolean equals(Object o) {
        if ( this == o ) {
            return true;
        }
        if ( !(o instanceof UuidObjetoNegocioPersistente) ) {
            return false;
        }
        UuidObjetoNegocioPersistente objeto = (UuidObjetoNegocioPersistente)o;
        if ( this.getId() != null ? !this.getId().equals(objeto.getId()) : this.getId() != null ) {
            return false;
        }

        return true;
    }


    public int hashCode() {
        if (this.getId() != null )
        	return this.getId().hashCode();
        else
        	throw new NoNegocioExcepcion("el objeto no posee Id");
    }


	public String getId() {
		return id;
	}


	public void setId(String id) {
		this.id = id;
	}
}
